#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "debugger.h"
#include "disasm.h"

// 测试函数 - 用于反汇编测试
int test_function_add(int a, int b) {
    int result = a + b;
    printf("加法结果: %d + %d = %d\n", a, b, result);
    return result;
}

void test_function_loop() {
    int sum = 0;
    for (int i = 0; i < 10; i++) {
        sum += i;
    }
    printf("循环求和结果: %d\n", sum);
}

void test_function_conditional() {
    int x = 42;
    if (x > 0) {
        printf("x是正数: %d\n", x);
    } else {
        printf("x是非正数: %d\n", x);
    }
}

// 测试反汇编功能
void test_disasm_basic() {
    printf("=== 测试基本反汇编功能 ===\n");
    
    debugger_t *dbg = debugger_create();
    assert(dbg != NULL);
    
    // 启动测试程序
    char *args[] = {"./test_disasm_program", NULL};
    if (debugger_launch(dbg, "./test_disasm_program", args) == 0) {
        printf("✓ 测试程序启动成功\n");
        
        // 测试反汇编当前指令
        printf("=== 反汇编当前指令 ===\n");
        if (debugger_disassemble_current(dbg, 10) == 0) {
            printf("✓ 当前指令反汇编成功\n");
        } else {
            printf("✗ 当前指令反汇编失败\n");
        }
        
        // 测试反汇编指定函数
        printf("\n=== 反汇编main函数 ===\n");
        if (debugger_disassemble_function(dbg, "main") == 0) {
            printf("✓ main函数反汇编成功\n");
        } else {
            printf("✗ main函数反汇编失败\n");
        }
        
        // 测试反汇编指定地址
        printf("\n=== 反汇编入口点附近指令 ===\n");
        if (debugger_disassemble(dbg, dbg->entry_point, 15) == 0) {
            printf("✓ 入口点反汇编成功\n");
        } else {
            printf("✗ 入口点反汇编失败\n");
        }
        
        debugger_detach(dbg);
    } else {
        printf("✗ 测试程序启动失败\n");
    }
    
    debugger_destroy(dbg);
    printf("=== 基本反汇编测试完成 ===\n\n");
}

// 测试反汇编器模块
void test_disasm_module() {
    printf("=== 测试反汇编器模块 ===\n");
    
    // 创建一个简单的进程用于测试
    pid_t child_pid = fork();
    if (child_pid == 0) {
        // 子进程
        while(1) {
            sleep(1); // 保持进程运行
        }
    } else if (child_pid > 0) {
        // 父进程
        disasm_t *disasm = disasm_create(child_pid);
        assert(disasm != NULL);
        
        // 测试反汇编
        disasm_result_t result;
        if (disasm_disassemble(disasm, 0x400000, 5, &result) == 0) {
            printf("✓ 反汇编成功，解码 %zu 条指令\n", result.count);
            disasm_print_result(&result);
            disasm_result_destroy(&result);
        } else {
            printf("✗ 反汇编失败\n");
        }
        
        disasm_destroy(disasm);
        kill(child_pid, SIGTERM); // 终止子进程
        waitpid(child_pid, NULL, 0);
    }
    
    printf("=== 反汇编器模块测试完成 ===\n\n");
}

// 简单的测试程序
int main_test_program() {
    printf("测试程序启动 (PID: %d)\n", getpid());
    
    int a = 10, b = 20;
    test_function_add(a, b);
    test_function_loop();
    test_function_conditional();
    
    printf("测试程序结束\n");
    return 0;
}

int main() {
    printf("开始反汇编功能测试\n\n");
    
    // 编译测试程序
    printf("编译测试程序...\n");
    system("gcc -g -o test_disasm_program test_disasm.c");
    
    // 运行测试
    test_disasm_module();
    test_disasm_basic();
    
    printf("所有反汇编测试完成！\n");
    
    // 清理
    remove("test_disasm_program");
    
    return 0;
}